<?php

/**
 * Неймспейс модуля подтверждений.
 *
 */
abstract class Confirm {

    /**
     * Длина генерируемого хэша.
     *
     * @var integer
     */
    const LENGTH = 16;

    /**
     * Период действия подтверждения в днях.
     *
     */
    const PERIOD = 3;

    /**
     * Создает подтверждение.
     *
     * @param   integer $id
     * @param   string  $module
     * @param   string  $action
     * @return  string
     */
    static public function create($id, $module, $action) {
        database::replace('system_confirm', array(
               'module' => $module,
               'action' => $action,
            'record_id' => $id,
                 'hash' => $hash = self::_generate(),
        ));
        return $hash;
    }
    
    /**
    * @desc Cancel confornation. Delete hash.
    * 
    * @param   integer $id
    * @param   string  $module
    * @param   string  $action
    * 
    * @return integer mysql_affected_rows
    */
    static public function cancel($id, $module, $action) 
    {
        return database::delete('system_confirm', array(
                'module' => $module,
                'action' => $action,
             'record_id' => $id,
        ));
    }

    /**
     * Генерирует уникальный хэш.
     *
     * @return  string
     */
    static private function _generate() {
        do {
            $hash = substr(md5(uniqid(rand())), 0, self::LENGTH);
            if (self::_isUnique($hash)) {
                return $hash;
            }
        } while (true);
    }

    /**
     * Проверяет хэш на уникальность.
     *
     * @param   string
     * @return  boolean
     */
    static private function _isUnique($value) {
        $query = 'SELECT
                         COUNT(*)
                    FROM
                         `system_confirm`
                   WHERE
                         `hash` = "' . database::escape($value) . '"';
        return 0 == database::fetchOne($query);
    }
}
